package smash_tris;

import java.io.Serializable;
import java.util.ArrayList;

/**
 * Klasa implementująca "pokój" wewnątrz którego toczy się rozgrywka.
 * 
 * @author Maciej Graszek
 * @author Pawel Rychly
 * 
 */
public class Room implements Serializable {

	private static Integer nextid = 0;

	private Integer id;
	private Integer size = 2;
	private ArrayList<Player> players = new ArrayList<Player>(size);
	private boolean ready = false;
	private Player roomMaster;
	private String name;

	// TODO weapon list
	/**
	 * Konstruktor
	 * @param player twórca pokoju.
	 * @param name nazwa pokoju.
	 */
	public Room(Player player, String name) {
		this.roomMaster = player;
		this.name = name;
		setId();

	}

	private final void setId() {
		this.id = Room.nextid;
		Room.nextid += 1;
	}
	
	
	public void setRoomMaster(Player roomMaster) {
		this.roomMaster = roomMaster;
	}

	/**
	 * Metoda zwraca listę graczy.
	 * 
	 * @return ArrayList of players.
	 * 
	 */
	public ArrayList<Player> getPlayers() {
		return players;
	}

	/**
	 * Metoda pozwala na sprawdzenie liczby graczy
	 * w pokoju.
	 * @return liczba graczy w pokoju.
	 */
	public int getNumPlay() {
		return players.size();		
	}

	/**
	 * Metoda zwraca nazwę pokoju.
	 * @return nazwa
	 */
	public String getName() {
		return this.name;
	}
	
	/**
	 * Metoda zwraca pojemność pokoju.
	 * @return
	 */
	public int getMaxSize() {
		return this.size;
	}

	/**
	 * Metoda pozwala na dodanie gracza do pokoju.
	 * @param pl
	 * @return true jeśli gracz zmieścił się w pokoju.
	 */
	public synchronized boolean addPlayer(Player pl) {
		if (players.size() < 2){
			System.out.println("Dodano : "+pl.getNick());
			players.add(pl);
			return true;
		}
		return false;
	}

	/**
	 * Metoda pozwala na usunięcie gracza z pokoju.
	 * @param pl gracz który ma zostać usunięty.
	 */
	public synchronized void removePlayer(Player pl) {
		players.remove(pl);		
	}
	
	/**
	 * Metoda zwraca twórcę pokoju.
	 * @return roomMaster
	 */
	public Player getRoomMaster(){
		return this.roomMaster;
	}
	
	/**
	 * Metoda zwraca index gracza w pokoju.
	 * Jeśli gracz nie znajduje się w pokoju, 
	 * zwracana jest wartość -1;
	 * @return indeks gracza w pokoju - 0, 1 lub
	 * -1 jeśli gracz nie znajduje sie w pokoju.
	 */
	public Integer getIndexOfPlayer(Player player){
		Integer i = 0;
		Integer index = -1;
		while (i < this.players.size()){
			if (this.players.get(i).equals(player)){
				index = i;
			}
			i++;
		}
		
		return index;
	}
	
	/**
	 * Metoda zwraca id pokoju.
	 * @return
	 */
	public Integer getRoomId(){
		return this.id;
	}
}